package com.cobo.zettelkasten.core

/**
 * 文本解析
 * @param formatter markdown附加的元数据，key-value 形式存储标题
 * @param content 正文内容
 */
data class RichText(val formatter: HashMap<String,String> = HashMap(), val content:String)


/**
 * <p>Markdown 文本解析</p>
 * */
interface RichTextExtract{
    /**
     * 解析文件内容，提取出标准blogText格式
     * */
    fun exec(markdownText:String): RichText
}

/**
 * Gray Matter 解析器
 * 用于解析文件头部的元数据信息，支持类似 YAML 格式的 key=value 形式
 * @param delimiter 元数据分隔符，默认为 "---"
 */
class GrayMatterExtract(val delimiter: String = "---") : RichTextExtract {
    override fun exec(markdownText: String): RichText {
        if (markdownText.isEmpty()) {
            return RichText(content = markdownText)
        }

        val lines = markdownText.split("\n")
        //不包含formatter格式，认为全部都是标准markdown返回
        if (lines[0] != delimiter || lines.count { it == delimiter } < 2) {
            return RichText(content = markdownText)
        }

        var formatterEnd = false
        val formatter = HashMap<String, String>()
        //收集所有不在formatter的标签
        val commonMdBuilder  = StringBuilder()
        for (i in 1 until lines.size) {
            if (formatterEnd) {
                commonMdBuilder.append(lines[i])
                    .append("\n")
            }else{
                if (lines[i].contains("=")) {
                    val formatterKv = lines[i].split("=")
                    if (formatterKv.size == 2) {
                        formatter[formatterKv[0].trim()] = formatterKv[1].trim()
                    }
                }
                formatterEnd = true
            }
        }
        return RichText(formatter, commonMdBuilder.toString())

    }

}